package io.github.echarts.option.series;

import io.github.echarts.option.abstracts.AbstractOption;
import io.github.echarts.option.style.ItemStyle;
import io.github.echarts.option.style.LabelStyle;

/**
 * 系列数据的基类。
 */
public abstract class SeriesOption extends AbstractOption {

    private static final long serialVersionUID = 1L;
    
    private String name;
    private String type;
    private Object data;
    private Boolean animation;
    private ItemStyle itemStyle;
    private LabelStyle label;
    private String coordinateSystem;
    private Integer coordinateSystemIndex;
    private String stack;
    private Integer zIndex;

    /**
     * 获取系列名称。
     *
     * @return 系列名称
     */
    public String getName() {
        return name;
    }

    /**
     * 设置系列名称。
     *
     * @param name 系列名称
     * @return 当前对象，用于链式调用
     */
    public SeriesOption setName(String name) {
        this.name = name;
        return this;
    }

    /**
     * 获取系列类型。
     *
     * @return 系列类型
     */
    public String getType() {
        return type;
    }

    /**
     * 设置系列类型。
     * 此方法为protected，因为具体类型应由子类固定设置。
     *
     * @param type 系列类型
     * @return 当前对象，用于链式调用
     */
    protected SeriesOption setType(String type) {
        this.type = type;
        return this;
    }
    
    /**
     * 设置系列类型。
     * 此方法为公开方法，用于适配层调用
     *
     * @param type 系列类型
     * @return 当前对象，用于链式调用
     */
    public SeriesOption setSeriesType(String type) {
        this.type = type;
        return this;
    }

    /**
     * 获取系列数据。
     *
     * @return 系列数据
     */
    public Object getData() {
        return data;
    }

    /**
     * 设置系列数据。
     *
     * @param data 系列数据
     * @return 当前对象，用于链式调用
     */
    public SeriesOption setData(Object data) {
        this.data = data;
        return this;
    }

    /**
     * 是否使用动画效果。
     *
     * @return 是否使用动画
     */
    public Boolean getAnimation() {
        return animation;
    }

    /**
     * 设置是否使用动画效果。
     *
     * @param animation 是否使用动画
     * @return 当前对象，用于链式调用
     */
    public SeriesOption setAnimation(Boolean animation) {
        this.animation = animation;
        return this;
    }
    
    /**
     * 获取图形样式。
     *
     * @return 图形样式
     */
    public ItemStyle getItemStyle() {
        return itemStyle;
    }

    /**
     * 设置图形样式。
     *
     * @param itemStyle 图形样式
     * @return 当前对象，用于链式调用
     */
    public SeriesOption setItemStyle(ItemStyle itemStyle) {
        this.itemStyle = itemStyle;
        return this;
    }
    
    /**
     * 获取标签样式。
     *
     * @return 标签样式
     */
    public LabelStyle getLabel() {
        return label;
    }

    /**
     * 设置标签样式。
     *
     * @param label 标签样式
     * @return 当前对象，用于链式调用
     */
    public SeriesOption setLabel(LabelStyle label) {
        this.label = label;
        return this;
    }
    
    /**
     * 获取坐标系类型。
     * 例如：'cartesian'（直角坐标系）、'polar'（极坐标系）、'radar'（雷达坐标系）等
     *
     * @return 坐标系类型
     */
    public String getCoordinateSystem() {
        return coordinateSystem;
    }
    
    /**
     * 设置坐标系类型。
     *
     * @param coordinateSystem 坐标系类型
     * @return 当前对象，用于链式调用
     */
    public SeriesOption setCoordinateSystem(String coordinateSystem) {
        this.coordinateSystem = coordinateSystem;
        return this;
    }
    
    /**
     * 获取坐标系索引。
     * 当页面存在多个相同类型的坐标系时，用于指定使用哪一个坐标系。
     *
     * @return 坐标系索引
     */
    public Integer getCoordinateSystemIndex() {
        return coordinateSystemIndex;
    }
    
    /**
     * 设置坐标系索引。
     *
     * @param coordinateSystemIndex 坐标系索引
     * @return 当前对象，用于链式调用
     */
    public SeriesOption setCoordinateSystemIndex(Integer coordinateSystemIndex) {
        this.coordinateSystemIndex = coordinateSystemIndex;
        return this;
    }
    
    /**
     * 获取数据堆叠的分组ID。
     * 具有相同堆叠ID的系列会在同一位置上堆叠显示。
     *
     * @return 堆叠分组ID
     */
    public String getStack() {
        return stack;
    }
    
    /**
     * 设置数据堆叠的分组ID。
     * 设置相同的值后，系列会在同一个位置上堆叠显示。
     *
     * @param stack 堆叠分组ID
     * @return 当前对象，用于链式调用
     */
    public SeriesOption setStack(String stack) {
        this.stack = stack;
        return this;
    }
    
    /**
     * 获取图表层叠顺序。
     * 数值越大，显示越上层。
     *
     * @return 层叠顺序值
     */
    public Integer getZIndex() {
        return zIndex;
    }
    
    /**
     * 设置图表层叠顺序。
     * 数值越大，显示越上层。
     *
     * @param zIndex 层叠顺序值
     * @return 当前对象，用于链式调用
     */
    public SeriesOption setZIndex(Integer zIndex) {
        this.zIndex = zIndex;
        return this;
    }
} 